home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / CW MacMindy 1.4 / Examples / QD3D-Viewer / Toolbox-Library Sources / Toolbox.dyl < prev   
Encoding:
Text File  |  1995-11-14  |  29.2 KB  |  876 lines  |  [TEXT/CWIE]

  1. module: Toolbox
  2.  
  3. define module Toolbox
  4.     use Dylan;                            // all programs need this.
  5.     use Extensions;                        // imports "main"
  6.     use Extern;                            // imports "load-object-file", etc.
  7.     
  8.     export
  9.         get-c-function, Debugger, DebugStr,
  10.         
  11.         $nil, $noErr,
  12.         
  13.         <Ptr>,     NewPtr, DisposePtr, 
  14.         <Handle>, NewHandle, DisposeHandle, HLock, HLockHi, HUnlock,
  15.         FreeMem,
  16.             
  17.         <Pascal-string>,
  18.         
  19.         <OSErr>, <OSType>, os-type,
  20.         
  21.         <Point>, point-v, point-v-setter, point-h, point-h-setter,
  22.         point,
  23.         
  24.         <Rect>, top, top-setter, left, left-setter,
  25.                 bottom, bottom-setter, right, right-setter,
  26.         
  27.         // Resource Manager.
  28.         GetResource, ReleaseResource,
  29.         
  30.         // Sound Manager.
  31.         SysBeep, SndPlay,
  32.                 
  33.         // Event Manager.
  34.         $everyEvent,
  35.         $nullEvent, $mouseDown, $mouseUp, $keyDown, $keyUp, $autoKey, $updateEvt, $diskEvt, $activateEvt,
  36.         $osEvt, $kHighLevelEvent,
  37.         $cmdKey,
  38.         <EventRecord>, event-what, event-message, event-when, event-where, event-modifiers,
  39.         GetNextEvent, SystemTask, WaitNextEvent,
  40.         AEProcessAppleEvent,
  41.         
  42.         TickCount, Button, WaitMouseUp, GetMouse,
  43.  
  44.         // QuickDraw.
  45.         <BitMap>, bounds, <QDGlobals>, screenBits, arrow, qd,
  46.         <RgnHandle>, NewRgn, DisposeRgn, SetEmptyRgn, SetRectRgn, RectRgn,
  47.         
  48.         <PicHandle>, DrawPicture,
  49.         
  50.         <GrafPtr>, <CGrafPtr>, portRect, SetPort,
  51.         MoveTo, LineTo, DrawString, TextFont,
  52.  
  53.         EraseRect, FrameRect, InvertRect, PaintRect,
  54.         GetClip, SetClip,
  55.         
  56.         PtInRect,
  57.         
  58.         // Cursors.
  59.         InitCursor, HideCursor, ShowCursor,
  60.         <Cursor>, <CursHandle>, GetCursor, SetCursor,
  61.         
  62.         // Fonts.
  63.         GetFNum,
  64.         
  65.         // Window Manager.
  66.         <WindowPtr>,
  67.         FrontWindow, ShowWindow, HideWindow, SelectWindow, SetWTitle,
  68.         GetNewWindow, GetNewCWindow, DisposeWindow, BeginUpdate, EndUpdate, DrawGrowIcon,
  69.         FindWindow,
  70.         $inDesk, $inMenuBar, $inSysWindow, $inContent, $inDrag, $inGrow, $inGoAway, $inZoomIn, $inZoomOut,
  71.         DragWindow, TrackGoAway, TrackBox, ZoomWindow, GrowWindow, SizeWindow,
  72.         
  73.         // Dialog Manager.
  74.         <DialogPtr>, <ModalFilterUPP>, Alert,
  75.         
  76.         // Menu Manager.
  77.         <MenuBarHandle>, <MenuHandle>,
  78.         GetNewMBar, SetMenuBar, DrawMenuBar, HiliteMenu,
  79.         MenuSelect, MenuKey,
  80.         GetMenuHandle, CountMItems, GetMenuItemText, EnableItem, DisableItem,
  81.         AppendResMenu,
  82.         
  83.         // Desk Accessories.
  84.         OpenDeskAcc,
  85.         
  86.         // OS Utils.
  87.         <DateTimeRec>, year, month, day, hour, minute, seconds, dayOfWeek,
  88.         GetDateTime, SecondsToDate,
  89.         
  90.         // Files.
  91.         <FSSpec>, vRefNum, parID, name,
  92.         FSMakeFSSpec, FSpOpenDF, FSClose,
  93.         $fsRdPerm, $fsWrPerm, $fsRdWrPerm, $fsRdWrShPerm,
  94.         
  95.         <StandardFileReply>, sfGood, sfFile,
  96.         StandardGetFile
  97. end module Toolbox;
  98.  
  99. // This is potentially useful, but will probably be overshadowed by Melange.
  100. // It combines the functionality of "find-c-function" and
  101. // "constrain-c-function" to get usable function in one step.
  102.  
  103. define constant gcf-unbound = pair(#f, #f); // hack
  104.  
  105. define method get-c-function (name :: <string>, #key args, rest = ~args,
  106.                                 result = <object>, file = gcf-unbound)
  107.  => (result :: <c-function>);
  108.   let real-args = if (args) as(<list>, args) else #() end if;
  109.   let real-result = if (instance?(result, <sequence>)) as(<list>, result)
  110.             else list(result)
  111.             end if;
  112.   let fun = if (file == gcf-unbound)
  113.           find-c-function(name)
  114.         else
  115.           find-c-function(name, file: file);
  116.         end if;
  117.   fun & constrain-c-function(fun, real-args, rest, real-result);
  118. end method get-c-function;
  119.  
  120. define constant *InterfaceLib* = load-object-file(#("InterfaceLib"));
  121.  
  122. // Low-Level Debugger.
  123.  
  124. define constant Debugger = get-c-function("Debugger", args: #(),
  125.                                             result: #(), file: *InterfaceLib*);
  126. define constant DebugStr = get-c-function("DebugStr", args: list(<Pascal-string>),
  127.                                             result: #(), file: *InterfaceLib*);
  128.  
  129. // Memory Manager.
  130.  
  131. define constant $nil = as(<statically-typed-pointer>, 0);
  132. define constant $noErr = 0;
  133.  
  134. // <Ptr>
  135.  
  136. define class <Ptr> (<statically-typed-pointer>) end class;
  137.  
  138. define constant NewPtr = get-c-function("NewPtr", args: list(<integer>),
  139.                                             result: <Ptr>, file: *InterfaceLib*);
  140. define constant DisposePtr = get-c-function("DisposePtr", args: list(<Ptr>),
  141.                                             result: #(), file: *InterfaceLib*);
  142.  
  143. define method destroy (pointer :: <Ptr>) => ();
  144.   DisposePtr(pointer);
  145. end method destroy;
  146.  
  147. define class <Handle> (<statically-typed-pointer>) end class;
  148.  
  149. define constant NewHandle = get-c-function("NewHandle", args: list(<integer>),
  150.                                             result: <Handle>, file: *InterfaceLib*);
  151. define constant DisposeHandle = get-c-function("DisposeHandle", args: list(<Handle>),
  152.                                             result: #(), file: *InterfaceLib*);
  153.  
  154. define constant HLock = get-c-function("HLock", args: list(<Handle>),
  155.                                             result: #(), file: *InterfaceLib*);
  156. define constant HLockHi = get-c-function("HLockHi", args: list(<Handle>),
  157.                                             result: #(), file: *InterfaceLib*);
  158. define constant HUnlock = get-c-function("HUnlock", args: list(<Handle>),
  159.                                             result: #(), file: *InterfaceLib*);
  160.  
  161. define method destroy (handle :: <Handle>) => ();
  162.   DisposeHandle(handle);
  163. end method destroy;
  164.  
  165.  
  166. define constant FreeMem = get-c-function("FreeMem", args: #(),
  167.                                             result: <integer>, file: *InterfaceLib*);
  168.  
  169. // Pascal Strings.
  170.  
  171. define class <Pascal-string> (<string>, <Ptr>) 
  172. end class <Pascal-string>;
  173.  
  174. define method as (cls == <Pascal-string>, str :: <Pascal-string>) => (result :: <Pascal-string>);
  175.   str;
  176. end method as;
  177.  
  178. define method make(cls :: limited(<class>, subclass-of: <Pascal-string>),
  179.                            #key size: sz = 0, fill = ' ')
  180.   let result = as(cls, NewPtr(256));
  181.   let fill-byte = as(<integer>, fill);
  182.   for (i from 1 to sz)
  183.     unsigned-byte-at(result, offset: i) := fill-byte;
  184.   end for;
  185.   unsigned-byte-at(result, offset: 0) := sz;
  186.   result;
  187. end method make;
  188.  
  189. define method forward-iteration-protocol(str :: <Pascal-string>)
  190.   values(0, #f,
  191.      method (str, state) state + 1 end method,
  192.      method (str, state, limit)
  193.        limit >= unsigned-byte-at(str);
  194.      end method,
  195.      method (str, state) state end method,
  196.      method (str, state)
  197.        as(<character>, unsigned-byte-at(str, offset: state + 1));
  198.      end method,
  199.      method (value :: <character>, str, state)
  200.        unsigned-byte-at(str, offset: state + 1) := as(<integer>, value);
  201.      end method,
  202.      method (str, state) state end method);
  203. end method forward-iteration-protocol;
  204.  
  205. /*
  206. define method \< (str1 :: <Pascal-string>, str2 :: <Pascal-string>)
  207.  => result :: <object>;
  208.   for (c1 in str1, c2 in str2, while c1 < c2)
  209.   finally
  210.     #t;
  211.   end for;
  212. end method \<;
  213. */
  214.  
  215. define method size (string :: <Pascal-string>) => result :: <integer>;
  216.     unsigned-byte-at(string, offset: 0);
  217. end method size;
  218.  
  219. define method size-setter (new-size :: <integer>, string :: <Pascal-string>)
  220.     unsigned-byte-at(string, offset: 0) := new-size;
  221. end method size-setter;
  222.  
  223. define method element (string :: <Pascal-string>, index :: <integer>, #key default: def) => <character>;
  224.   as(<character>, unsigned-byte-at(string, offset: index + 1));
  225. end method element;
  226.  
  227. define method element-setter (value :: <character>, string :: <Pascal-string>, index :: <integer>)
  228.   unsigned-byte-at(string, offset: index + 1) := as(<integer>, value);
  229. end method element-setter;
  230.  
  231. // This is a very common operation, so let's make it fast.
  232.  
  233. define method as (cls == <Pascal-string>, str :: <byte-string>)
  234.   let sz = str.size;
  235.   let result = as(<Pascal-string>, NewPtr(256));
  236.   for (i from 1 to sz)
  237.     unsigned-byte-at(result, offset: i) := as(<integer>, str[i - 1]);
  238.   end for;
  239.   unsigned-byte-at(result, offset: 0) := sz;
  240.   result;
  241. end method as;
  242.  
  243. // This is a very common operation, so let's make it fast.
  244. //
  245. define method as (cls == <byte-string>, str :: <Pascal-string>)
  246.   let sz = str.size;
  247.   let result = make(<string>, size: sz);
  248.   for (i from 0 below sz)
  249.     result[i] := as(<character>, unsigned-byte-at(str, offset: i + 1));
  250.   end for;
  251.   result;
  252. end method as;
  253.  
  254. // OSErr.
  255.  
  256. define constant <OSErr> = <integer>;
  257.  
  258. // OSType.
  259.  
  260. define constant <OSType> = <extended-integer>;
  261.  
  262. define constant os-type = method (typestr :: <string>) => (result :: <OSType>);
  263.     let type = as(<OSType>, as(<integer>, typestr[0]));
  264.     for (i from 1 below 4)
  265.         type := type * 256 + as(<integer>, typestr[i]);
  266.     finally
  267.         type;
  268.     end for;
  269. end method;
  270.  
  271. // Points.
  272.  
  273. define class <Point> (<Ptr>) end class;
  274.  
  275. define method point-v (pt :: <Point>) => (v :: <integer>);
  276.     signed-short-at(pt, offset: 0);
  277. end method point-v;
  278.  
  279. define method point-v-setter (value :: <integer>, pt :: <Point>) => (value :: <integer>);
  280.     signed-short-at(pt, offset: 0) := value;
  281. end method point-v-setter;
  282.  
  283. define method point-h (pt :: <Point>) => (h :: <integer>);
  284.     signed-short-at(pt, offset: 2);
  285. end method point-h;
  286.  
  287. define method point-h-setter (value :: <integer>, pt :: <Point>) => (value :: <integer>);
  288.     signed-short-at(pt, offset: 2) := value;
  289. end method point-h-setter;
  290.  
  291. define method point (x :: <integer>, y :: <integer>) => (pt :: <Point>);
  292.     let pt = as (<Point>, NewPtr(4));
  293.     pt.point-v := y;
  294.     pt.point-h := x;
  295.     pt;
  296. end method point;
  297.  
  298. define method make(cls == <Point>, #key v: pv = 0, h: ph = 0)
  299.   let pt = as(<Point>, NewPtr(4));
  300.     pt.point-v := pv;
  301.     pt.point-h := ph;
  302.   pt;
  303. end method make;
  304.  
  305. define method as (cls == <integer>, pt :: <Point>) => (result :: <integer>);
  306.     as(<extended-integer>, signed-long-at(pt));
  307. //    as(<integer>, signed-long-at(pt));
  308. end method as;
  309.  
  310. // Rectangles.
  311.  
  312. define class <Rect> (<Ptr>) end class;
  313.  
  314. define method top (rect :: <Rect>) => (top :: <integer>);
  315.     signed-short-at(rect, offset: 0);
  316. end method top;
  317.  
  318. define method top-setter (value :: <integer>, rect :: <Rect>) => (top :: <integer>);
  319.     signed-short-at(rect, offset: 0) := value;
  320. end method top-setter;
  321.  
  322. define method left (rect :: <Rect>) => (left :: <integer>);
  323.     signed-short-at(rect, offset: 2);
  324. end method left;
  325.  
  326. define method left-setter (value :: <integer>, rect :: <Rect>) => (left :: <integer>);
  327.     signed-short-at(rect, offset: 2) := value;
  328. end method left-setter;
  329.  
  330. define method bottom (rect :: <Rect>) => (bottom :: <integer>);
  331.     signed-short-at(rect, offset: 4);
  332. end method bottom;
  333.  
  334. define method bottom-setter (value :: <integer>, rect :: <Rect>) => (bottom :: <integer>);
  335.     signed-short-at(rect, offset: 4) := value;
  336. end method bottom-setter;
  337.  
  338. define method right (rect :: <Rect>) => (right :: <integer>);
  339.     signed-short-at(rect, offset: 6);
  340. end method right;
  341.  
  342. define method right-setter (value :: <integer>, rect :: <Rect>) => (right :: <integer>);
  343.     signed-short-at(rect, offset: 6) := value;
  344. end method right-setter;
  345.  
  346. define method make(cls == <Rect>, #key top: t = 0, left: l = 0,
  347.                         bottom: b = 0, right: r = 0)
  348.   let rect = as(<Rect>, NewPtr(8));
  349.   rect.top := t;
  350.   rect.left := l;
  351.   rect.bottom := b;
  352.   rect.right := r;
  353.   rect;
  354. end method make;
  355.  
  356. // this one's harder to express using Toolbox interface.
  357.  
  358. /*
  359. define constant PtInRect = method (pt :: <Point>, rect :: <Rect>) => (result :: <Boolean>);
  360.     (pt.point-v >= rect.top &
  361.      pt.point-h >= rect.left &
  362.      pt.point-v <= rect.bottom &
  363.      pt.point-h <= rect.right);
  364. end method;
  365. */
  366.  
  367. define constant PtInRect = 
  368. begin
  369.     let func = get-c-function("PtInRect", args: list(<integer>, <Rect>),
  370.                                             result: <boolean>, file: *InterfaceLib*);
  371.     method (pt :: <Point>, rect :: <Rect>) => (result :: <boolean>);
  372.         func(as(<integer>, pt), rect);
  373.     end method;
  374. end;
  375.  
  376. // Resource Manager.
  377.  
  378. define constant GetResource = get-c-function("GetResource", args: list(<OSType>, <integer>),
  379.                                             result: <Handle>, file: *InterfaceLib*);
  380. define constant ReleaseResource = get-c-function("ReleaseResource", args: list(<Handle>),
  381.                                             result: #(), file: *InterfaceLib*);
  382.  
  383. // Sound Manager.
  384.  
  385. define constant SysBeep = get-c-function("SysBeep", args: list(<integer>),
  386.                                             result: #(), file: *InterfaceLib*);
  387.  
  388. define class <SndChannel> (<Ptr>) end class;
  389.  
  390. define constant SndPlay = get-c-function("SndPlay", args: list(<SndChannel>, <Handle>, <boolean>),
  391.                                             result: <OSErr>, file: *InterfaceLib*);
  392.  
  393. // Event Manager.
  394.                                             
  395. define constant $everyEvent = -1;
  396.  
  397. // event codes.
  398. define constant $nullEvent = 0;
  399. define constant $mouseDown = 1;
  400. define constant $mouseUp = 2;
  401. define constant $keyDown = 3;
  402. define constant $keyUp = 4;
  403. define constant $autoKey = 5;
  404. define constant $updateEvt = 6;
  405. define constant $diskEvt = 7;
  406. define constant $activateEvt = 8;
  407. define constant $osEvt = 15;
  408. define constant $kHighLevelEvent = 23;
  409.  
  410. // modifier masks.
  411. define constant $cmdKey = 256;
  412.  
  413. define class <EventRecord> (<Ptr>) end class;
  414.  
  415. define method make(cls == <EventRecord>, #key what: what)
  416.     as(<EventRecord>, NewPtr(16));
  417. end method make;
  418.  
  419. define method event-what (event :: <EventRecord>) => (what :: <integer>);
  420.     signed-short-at(event, offset: 0);
  421. end method event-what;
  422.  
  423. define method event-message (event :: <EventRecord>) => (message :: <integer>);
  424.     unsigned-long-at(event, offset: 2);
  425. end method event-message;
  426.  
  427. define method event-when (event :: <EventRecord>) => (when :: <integer>);
  428.     unsigned-long-at(event, offset: 6);
  429. end method event-when;
  430.  
  431. define method event-where (event :: <EventRecord>) => (where :: <Point>);
  432.     as (<Point>, event + 10);
  433. end method event-where;
  434.  
  435. define method event-modifiers (event :: <EventRecord>) => (modifiers :: <integer>);
  436.     signed-short-at(event, offset: 14);
  437. end method event-modifiers;
  438.  
  439. define constant GetNextEvent = get-c-function("GetNextEvent", args: list(<integer>, <EventRecord>),
  440.                                             result: <boolean>, file: *InterfaceLib*);
  441. define constant SystemTask = get-c-function("SystemTask", args: #(),
  442.                                             result: #(), file: *InterfaceLib*);
  443. define constant WaitNextEvent = get-c-function("WaitNextEvent", args: list(<integer>, <EventRecord>, <integer>, <RgnHandle>),
  444.                                             result: <boolean>, file: *InterfaceLib*);
  445.  
  446. define constant AEProcessAppleEvent = get-c-function("AEProcessAppleEvent", args: list(<EventRecord>),
  447.                                             result: <OSErr>, file: *InterfaceLib*);
  448.                     
  449. define constant TickCount = get-c-function("TickCount", args: #(),
  450.                                             result: <integer>, file: *InterfaceLib*);
  451.  
  452. define constant Button = get-c-function("Button", args: #(),
  453.                                             result: <boolean>, file: *InterfaceLib*);
  454. define constant WaitMouseUp = get-c-function("WaitMouseUp", args: #(),
  455.                                             result: <boolean>, file: *InterfaceLib*);
  456.  
  457. define constant GetMouse = get-c-function("GetMouse", args: list(<Point>),
  458.                                             result: #(), file: *InterfaceLib*);
  459.  
  460. // QuickDraw.
  461.  
  462. define class <BitMap> (<statically-typed-pointer>) end class;
  463.  
  464. define method bounds (bitmap :: <BitMap>) => (result :: <Rect>);
  465.     as(<Rect>, bitmap + 6);
  466. end method;
  467.  
  468. define class <QDGlobals> (<statically-typed-pointer>) end class;
  469.  
  470. define method screenBits (qd :: <QDGlobals>) => (result :: <BitMap>);
  471.     as(<BitMap>, qd + 80);
  472. end method;
  473.  
  474. define method arrow (qd :: <QDGlobals>) => (result :: <Cursor>);
  475.     as(<Cursor>, qd + 94);
  476. end method;
  477.  
  478. define constant qd = as(<QDGlobals>, find-c-pointer("qd"));
  479.  
  480. define class <RgnHandle> (<Handle>) end class;
  481.  
  482. define constant NewRgn = get-c-function("NewRgn", args: #(),
  483.                                             result: <RgnHandle>, file: *InterfaceLib*);
  484. define constant DisposeRgn = get-c-function("DisposeRgn", args: list(<RgnHandle>),
  485.                                             result: #(), file: *InterfaceLib*);
  486. define constant SetEmptyRgn = get-c-function("SetEmptyRgn", args: list(<RgnHandle>),
  487.                                             result: #(), file: *InterfaceLib*);
  488. define constant SetRectRgn = get-c-function("SetRectRgn", args: list(<RgnHandle>, <integer>, <integer>, <integer>, <integer>),
  489.                                             result: #(), file: *InterfaceLib*);
  490. define constant RectRgn = get-c-function("RectRgn", args: list(<RgnHandle>, <Rect>),
  491.                                             result: #(), file: *InterfaceLib*);
  492.  
  493. define class <PicHandle> (<Handle>) end class;
  494. define constant DrawPicture = get-c-function("DrawPicture", args: list(<PicHandle>),
  495.                                             result: #(), file: *InterfaceLib*);
  496.  
  497. define class <GrafPtr> (<Ptr>) end class;
  498.  
  499. define constant <CGrafPtr> = <GrafPtr>;
  500.  
  501. define method portRect (port :: <GrafPtr>)
  502.     as(<Rect>, port + 16);
  503. end method;
  504.  
  505. define constant SetPort = get-c-function("SetPort", args: list(<GrafPtr>),
  506.                                             result: #(), file: *InterfaceLib*);
  507.  
  508. define constant MoveTo = get-c-function("MoveTo", args: list(<integer>, <integer>),
  509.                                             result: #(), file: *InterfaceLib*);
  510. define constant LineTo = get-c-function("LineTo", args: list(<integer>, <integer>),
  511.                                             result: #(), file: *InterfaceLib*);
  512. define constant DrawString = get-c-function("DrawString", args: list(<string>),
  513.                                             result: #(), file: *InterfaceLib*);
  514. define constant TextFont = get-c-function("TextFont", args: list(<integer>),
  515.                                             result: #(), file: *InterfaceLib*);
  516.  
  517. define constant EraseRect = get-c-function("EraseRect", args: list(<Rect>),
  518.                                             result: #(), file: *InterfaceLib*);
  519. define constant FrameRect = get-c-function("FrameRect", args: list(<Rect>),
  520.                                             result: #(), file: *InterfaceLib*);
  521. define constant InvertRect = get-c-function("InvertRect", args: list(<Rect>),
  522.                                             result: #(), file: *InterfaceLib*);
  523. define constant PaintRect = get-c-function("PaintRect", args: list(<Rect>),
  524.                                             result: #(), file: *InterfaceLib*);
  525.  
  526. // Clipping.
  527.  
  528. define constant GetClip = get-c-function("GetClip", args: list(<RgnHandle>),
  529.                                             result: #(), file: *InterfaceLib*);
  530. define constant SetClip = get-c-function("SetClip", args: list(<RgnHandle>),
  531.                                             result: #(), file: *InterfaceLib*);
  532.  
  533. // Cursors.
  534.                                 
  535. define constant InitCursor = get-c-function("InitCursor", args: #(),
  536.                                             result: #(), file: *InterfaceLib*);
  537. define constant HideCursor = get-c-function("HideCursor", args: #(),
  538.                                             result: #(), file: *InterfaceLib*);
  539. define constant ShowCursor = get-c-function("ShowCursor", args: #(),
  540.                                             result: #(), file: *InterfaceLib*);
  541.  
  542. define class <Cursor> (<Ptr>) end class;
  543. define class <CursHandle> (<Handle>) end class;
  544.  
  545. define constant GetCursor = get-c-function("GetCursor", args: list(<integer>),
  546.                                             result: <CursHandle>, file: *InterfaceLib*);
  547. define constant SetCursor = get-c-function("SetCursor", args: list(<Cursor>),
  548.                                             result: #(), file: *InterfaceLib*);
  549.  
  550. // Fonts.
  551.  
  552. define constant GetFNum =
  553. begin
  554.     let func = get-c-function("GetFNum", args: list(<Pascal-string>, <Ptr>),
  555.                                 result: #(), file: *InterfaceLib*);
  556.     method(fontName :: <Pascal-string>) => (fontNumber :: <integer>);
  557.         let fontNumPtr = stack-alloc(<Ptr>, 2);    // sizeof(short).
  558.         func(fontName, fontNumPtr);
  559.         signed-short-at(fontNumPtr);
  560.     end method;
  561. end;
  562.  
  563. // Windows.
  564.  
  565. define constant <WindowPtr> = <GrafPtr>;
  566.  
  567. define constant FrontWindow = get-c-function("FrontWindow", args: #(),
  568.                                             result: <WindowPtr>, file: *InterfaceLib*);
  569. define constant ShowWindow = get-c-function("ShowWindow", args: list(<WindowPtr>),
  570.                                             result: #(), file: *InterfaceLib*);
  571. define constant HideWindow = get-c-function("HideWindow", args: list(<WindowPtr>),
  572.                                             result: #(), file: *InterfaceLib*);
  573. define constant SelectWindow = get-c-function("SelectWindow", args: list(<WindowPtr>),
  574.                                             result: #(), file: *InterfaceLib*);
  575. define constant SetWTitle = get-c-function("SetWTitle", args: list(<WindowPtr>, <Pascal-string>),
  576.                                             result: #(), file: *InterfaceLib*);
  577.  
  578. define constant GetNewWindow =
  579. begin
  580.     let func = get-c-function("GetNewWindow", args: list(<integer>, <WindowPtr>, <WindowPtr>),
  581.                                 result: <WindowPtr>, file: *InterfaceLib*);
  582.     method (windowID :: <integer>, #key storage: st = as(<WindowPtr>, 0), behind: bw = as(<WindowPtr>, -1))
  583.         func(windowID, st, bw);
  584.     end method;
  585. end;
  586.  
  587. define constant GetNewCWindow =
  588. begin
  589.     let func = get-c-function("GetNewCWindow", args: list(<integer>, <WindowPtr>, <WindowPtr>),
  590.                                 result: <WindowPtr>, file: *InterfaceLib*);
  591.     method (windowID :: <integer>, #key storage: st = as(<WindowPtr>, 0), behind: bw = as(<WindowPtr>, -1))
  592.         func(windowID, st, bw);
  593.     end method;
  594. end;
  595.  
  596. define constant DisposeWindow = get-c-function("DisposeWindow", args: list(<WindowPtr>),
  597.                                             result: #(), file: *InterfaceLib*);
  598.  
  599. define constant BeginUpdate = get-c-function("BeginUpdate", args: list(<WindowPtr>),
  600.                                             result: #(), file: *InterfaceLib*);
  601. define constant EndUpdate = get-c-function("EndUpdate", args: list(<WindowPtr>),
  602.                                             result: #(), file: *InterfaceLib*);
  603. define constant DrawGrowIcon = get-c-function("DrawGrowIcon", args: list(<WindowPtr>),
  604.                                             result: #(), file: *InterfaceLib*);
  605.  
  606. define constant FindWindow =
  607. begin
  608.     let func = get-c-function("FindWindow", args: list(<integer>, <Ptr>),
  609.                                 result: <integer>, file: *InterfaceLib*);
  610.     method (pt :: <Point>) => (partCode :: <integer>, window :: <WindowPtr>);
  611.         // need storage to hold pointer to the WindowPtr.
  612.         let whichWindow = stack-alloc(<Ptr>, 4);
  613.         let partCode = func(as(<integer>, pt), whichWindow);
  614.         values(partCode, as(<WindowPtr>, pointer-at(whichWindow)));
  615.     end method;
  616. end;
  617.  
  618. define constant $inDesk = 0;
  619. define constant $inMenuBar = 1;
  620. define constant $inSysWindow = 2;
  621. define constant $inContent = 3;
  622. define constant $inDrag = 4;
  623. define constant $inGrow = 5;
  624. define constant $inGoAway = 6;
  625. define constant $inZoomIn = 7;
  626. define constant $inZoomOut = 8;
  627.  
  628. define constant DragWindow =
  629. begin
  630.     let func = get-c-function("DragWindow", args: list(<WindowPtr>, <integer>, <Rect>),
  631.                                 result: #(), file: *InterfaceLib*);
  632.     method (window :: <WindowPtr>, clickPt :: <Point>, #key bounds: bnds :: <Rect> = qd.screenBits.bounds) => ();
  633.         func(window, as(<integer>, clickPt), bnds);
  634.     end method;
  635. end;
  636.  
  637. define constant TrackGoAway =
  638. begin
  639.     let func = get-c-function("TrackGoAway", args: list(<WindowPtr>, <integer>),
  640.                                 result: <boolean>, file: *InterfaceLib*);
  641.     method (window :: <WindowPtr>, clickPt :: <Point>) => (result :: <boolean>);
  642.         func(window, as(<integer>, clickPt));
  643.     end method;
  644. end;
  645.  
  646. define constant TrackBox =
  647. begin
  648.     let func = get-c-function("TrackBox", args: list(<WindowPtr>, <integer>, <integer>),
  649.                                 result: <boolean>, file: *InterfaceLib*);
  650.     method (window :: <WindowPtr>, clickPt :: <Point>, partCode :: <integer>) => (result :: <boolean>);
  651.         func(window, as(<integer>, clickPt), partCode);
  652.     end method;
  653. end;
  654.  
  655. define constant ZoomWindow = get-c-function("ZoomWindow", args: list(<WindowPtr>, <integer>, <boolean>),
  656.                                             result: #(), file: *InterfaceLib*);
  657.  
  658. define constant GrowWindow =
  659. begin
  660.     let func = get-c-function("GrowWindow", args: list(<WindowPtr>, <integer>, <Rect>),
  661.                                 result: <extended-integer>, file: *InterfaceLib*);
  662.     method (window :: <WindowPtr>, clickPt :: <Point>, sizeRect :: <Rect>)
  663.       => (height :: <integer>, width :: <integer>);
  664.         let result = func(window, as(<integer>, clickPt), sizeRect);
  665.         floor/(result, 65536);    // split up the upper and lower halves of the result.
  666.     end method;
  667. end;
  668.  
  669. define constant SizeWindow = get-c-function("SizeWindow", args: list(<WindowPtr>, <integer>, <integer>, <boolean>),
  670.                                             result: #(), file: *InterfaceLib*);
  671.  
  672. // Dialogs.
  673.  
  674. define constant <DialogPtr> = <GrafPtr>;
  675. define class <ModalFilterUPP> (<statically-typed-pointer>) end class;
  676.  
  677. define constant Alert =
  678. begin
  679.     let func = get-c-function("Alert", args: list(<integer>, <ModalFilterUPP>),
  680.                                 result: <integer>, file: *InterfaceLib*);
  681.     method (id :: <integer>, #key filter: flt = #f)
  682.         if (~flt)
  683.             flt := as(<ModalFilterUPP>, 0);
  684.         end if;
  685.         func(id, flt);
  686.     end method;
  687. end;
  688.  
  689. // Menu Manager.
  690.  
  691. define class <MenuBarHandle> (<Handle>) end class;
  692. define class <MenuHandle> (<Handle>) end class;
  693.  
  694. define constant GetNewMBar = get-c-function("GetNewMBar", args: list(<integer>),
  695.                                             result: <MenuBarHandle>, file: *InterfaceLib*);
  696. define constant SetMenuBar = get-c-function("SetMenuBar", args: list(<MenuBarHandle>),
  697.                                             result: #(), file: *InterfaceLib*);
  698. define constant DrawMenuBar = get-c-function("DrawMenuBar", args: #(),
  699.                                             result: #(), file: *InterfaceLib*);
  700. define constant HiliteMenu = get-c-function("HiliteMenu", args: list(<integer>),
  701.                                             result: #(), file: *InterfaceLib*);
  702.  
  703. // Note:  the following use <extended-integer> because all 32-bits of the result are significant.
  704.  
  705. define constant MenuSelect =
  706. begin
  707.     let func = get-c-function("MenuSelect", args: list(<integer>),
  708.                                             result: <extended-integer>, file: *InterfaceLib*);
  709.     method (clickPt :: <Point>) => (menu :: <integer>, item :: <integer>);
  710.         let result = func(as(<integer>, clickPt));
  711.         floor/(result, 65536);
  712. //        let (menu, item) = floor/(result, 65536);
  713. //        values(menu, item);
  714. //        values(as(<fixed-integer>, menu), as(<fixed-integer>, item));
  715.     end method;
  716. end;
  717.  
  718. define constant MenuKey =
  719. begin
  720.     let func = get-c-function("MenuKey", args: list(<integer>),
  721.                                             result: list(<extended-integer>), file: *InterfaceLib*);
  722.     method (ch :: <character>) => (menu :: <integer>, item :: <integer>);
  723.         let result = func(as(<integer>, ch));
  724.         floor/(result, 65536);
  725. //        let (menu, item) = floor/(result, 65536);
  726. //        values(menu, item);
  727. //        values(as(<fixed-integer>, menu), as(<fixed-integer>, item));
  728.     end method;
  729. end;
  730.  
  731. define constant GetMenuHandle = get-c-function("GetMenuHandle", args: list(<integer>),
  732.                                             result: <MenuHandle>, file: *InterfaceLib*);
  733. define constant CountMItems = get-c-function("CountMItems", args: list(<MenuHandle>),
  734.                                             result: <integer>, file: *InterfaceLib*);
  735. define constant GetMenuItemText = get-c-function("GetMenuItemText",
  736.                                             args: list(<MenuHandle>, <integer>, <Pascal-string>),
  737.                                             result: <integer>, file: *InterfaceLib*);
  738. define constant EnableItem = get-c-function("EnableItem", args: list(<MenuHandle>, <integer>),
  739.                                             result: #(), file: *InterfaceLib*);
  740. define constant DisableItem = get-c-function("DisableItem", args: list(<MenuHandle>, <integer>),
  741.                                             result: #(), file: *InterfaceLib*);
  742.  
  743. // adding resource types to menus.
  744.  
  745. define constant AppendResMenu = get-c-function("AppendResMenu", args: list(<MenuHandle>, <OSType>),
  746.                                             result: #(), file: *InterfaceLib*);
  747.  
  748. // Desk Accessory Support.
  749.  
  750. define constant OpenDeskAcc = get-c-function("OpenDeskAcc",
  751.                                             args: list(<Pascal-string>),
  752.                                             result: <integer>, file: *InterfaceLib*);
  753.  
  754. // OSUtils.
  755.  
  756. define constant GetDateTime =
  757. begin
  758.     let func = get-c-function("GetDateTime", args: list(<Ptr>),
  759.                                             result: #(), file: *InterfaceLib*);
  760.     method () => (time :: <integer>);
  761.         let longPtr = stack-alloc(<Ptr>, 4);    // sizeof(long)
  762.         func(longPtr);
  763.         let time = as(<extended-integer>, unsigned-short-at(longPtr));
  764.         time * 65536 + as(<extended-integer>, unsigned-short-at(longPtr, offset: 2));
  765.     end method;
  766. end;
  767.  
  768. define class <DateTimeRec> (<Ptr>) end class;
  769.  
  770. define method year (dateTime :: <DateTimeRec>) => (result :: <integer>);
  771.     signed-short-at(dateTime, offset: 0);
  772. end method year;
  773.  
  774. define method month (dateTime :: <DateTimeRec>) => (result :: <integer>);
  775.     signed-short-at(dateTime, offset: 2);
  776. end method month;
  777.  
  778. define method day (dateTime :: <DateTimeRec>) => (result :: <integer>);
  779.     signed-short-at(dateTime, offset: 4);
  780. end method day;
  781.  
  782. define method hour (dateTime :: <DateTimeRec>) => (result :: <integer>);
  783.     signed-short-at(dateTime, offset: 6);
  784. end method hour;
  785.  
  786. define method minute (dateTime :: <DateTimeRec>) => (result :: <integer>);
  787.     signed-short-at(dateTime, offset: 8);
  788. end method minute;
  789.  
  790. define method seconds (dateTime :: <DateTimeRec>) => (result :: <integer>);
  791.     signed-short-at(dateTime, offset: 10);
  792. end method seconds;
  793.  
  794. define method dayOfWeek (dateTime :: <DateTimeRec>) => (result :: <integer>);
  795.     signed-short-at(dateTime, offset: 12);
  796. end method dayOfWeek;
  797.  
  798. define constant SecondsToDate = get-c-function("SecondsToDate", args: list(<extended-integer>, <DateTimeRec>),
  799.                                             result: #(), file: *InterfaceLib*);
  800.  
  801. // Files.
  802.  
  803. define class <FSSpec> (<Ptr>) end class;
  804.  
  805. define method vRefNum (spec :: <FSSpec>) => (result :: <integer>);
  806.     signed-short-at(spec, offset: 0);
  807. end method vRefNum;
  808.  
  809. define method parID (spec :: <FSSpec>) => (result :: <integer>);
  810.     signed-long-at(spec, offset: 2);
  811. end method parID;
  812.  
  813. define method name (spec :: <FSSpec>) => (result :: <Pascal-string>);
  814.     as(<Pascal-string>, spec + 6);
  815. end method name;
  816.  
  817. define constant FSMakeFSSpec =
  818. begin
  819.     // need storage to hold pointer to the WindowPtr.
  820.     let func = get-c-function("FSMakeFSSpec",
  821.                                 args: list(<integer>, <integer>, <Pascal-string>, <FSSpec>),
  822.                                 result: <OSErr>, file: *InterfaceLib*);
  823.     method (volume :: <integer>, directory, name :: <Pascal-string>)
  824.      => (result :: <OSErr>, spec :: <FSSpec>);
  825.         let spec = as(<FSSpec>, NewPtr(70));
  826.         let result = func(volume, directory, name, spec);
  827.         values(result, spec);
  828.     end method;
  829. end;
  830.  
  831. define constant $fsRdPerm = 1;
  832. define constant $fsWrPerm = 2;
  833. define constant $fsRdWrPerm = 3;
  834. define constant $fsRdWrShPerm = 4;
  835.  
  836. define constant FSpOpenDF =
  837. begin
  838.     // need storage to hold pointer to the WindowPtr.
  839.     let refNumPtr = NewPtr(2);
  840.     let func = get-c-function("FSpOpenDF", args: list(<FSSpec>, <integer>, <Ptr>),
  841.                                 result: <integer>, file: *InterfaceLib*);
  842.     method (spec :: <FSSpec>, permission :: <integer>)
  843.      => (result :: <OSErr>, refNum :: <integer>);
  844.         let result = func(spec, permission, refNumPtr);
  845.         values(result, signed-short-at(refNumPtr));
  846.     end method;
  847. end;
  848.  
  849. define constant FSClose = get-c-function("FSClose",
  850.                                         args: list(<integer>),
  851.                                         result: <OSErr>, file: *InterfaceLib*);
  852.  
  853. define class <StandardFileReply> (<Ptr>) end class;
  854.  
  855. define method sfGood (reply :: <StandardFileReply>) => (result :: <boolean>);
  856.     signed-byte-at(reply, offset: 0) ~= 0;
  857. end method sfGood;
  858.  
  859. define method sfFile (reply :: <StandardFileReply>) => (result :: <FSSpec>);
  860.     as(<FSSpec>, reply + 6);
  861. end method sfFile;
  862.  
  863. define method make(cls == <StandardFileReply>, #key, #all-keys)
  864.   as(<StandardFileReply>, NewPtr(88));
  865. end method make;
  866.  
  867. define constant StandardGetFile =
  868. begin
  869.     let func = get-c-function("StandardGetFile", args: list(<Ptr>, <integer>, <Ptr>, <StandardFileReply>),
  870.                                 result: #(), file: *InterfaceLib*);
  871.     method (reply :: <StandardFileReply>) => (result :: <boolean>);
  872.         func($nil, -1, $nil, reply);
  873.         reply.sfGood;
  874.     end method;
  875. end;
  876.